# =======================================================
# 关于文件操作的静态函数库
# =======================================================

class_name myFSO

# ======================== 文件内容读写 ======================== 


class mFile:
	var path:String
	var file = File.new()
	
	func save(content,append:=false) -> void:
		var old = ""
		if file.file_exists(path): # 文件存在
			file.open(path,File.READ_WRITE)
		else:
			file.open(path,File.WRITE) # WRITE模式可以创建不存在的文件
		if append:
			file.seek_end() # 定位到文件末尾
		match typeof(content): # 根据传入的参数类型
			TYPE_STRING: # 字符串
				file.store_string(content + "\n")
			TYPE_DICTIONARY: # 字典
				var ctn = to_json(content) 
				file.store_string(ctn + "\n") 
			TYPE_ARRAY: # 参数为数组
				match typeof(content[0]): # 以第一个数组元素类型决定
					TYPE_ARRAY: # 第一个子元素还是数组
						for ctn in content:
							if typeof(ctn) == TYPE_ARRAY: # 过滤非数组元素
								file.store_csv_line(ctn) 
					TYPE_DICTIONARY: # 第一个子元素为字典
						for ctn in content:
							if typeof(ctn) == TYPE_DICTIONARY: # 过滤非字典元素
								file.store_line(to_json(ctn)) 
					TYPE_STRING: # 第一个元素为字符串
						file.store_csv_line(content) 
		file.seek(0) # 重新定位回文件起始
		file.close()

	func append(content) -> void:
		save(content,true)
		pass
		
	# 整体加载 - 整个文件内容作为纯文本返回
	func loadEntirety() -> String:
		file.open(path,File.READ)
		var string = file.get_as_text()
		file.close()
		return string
	
	# 删除文件
	func kill() -> void:
		var dir = Directory.new()
		if dir.dir_exists(path):
			dir.remove(path)
		pass
		
	
# 纯文本文件按行分割的数组
class FileLines:
	var path:String
	var file = File.new()
	var lis:PoolStringArray = [] 
	
	# 获取模式
	enum GETMODE {
		GET_STRING,
		GET_JSON,
		GET_CSV
	}
	
	func _init(fPath:String):
		path = fPath
		file.open(path,File.READ)
		var ctn = file.get_as_text()
		lis = ctn.split("\n") # 按行切割为数组
		file.close()
		
	func getLine(idx:int,getMode:=GETMODE.GET_STRING):
		idx = idx + 1
		match getMode:
			GETMODE.GET_STRING:
				return lis[idx]
			GETMODE.GET_JSON:
				var json = parse_json(lis[idx])
				return json
			GETMODE.GET_CSV:
				return to_csv(lis[idx])
		pass
	
	func setLine(idx:int,ctn:String) -> void:
		lis[idx] = ctn
		pass
	
	func add(ctn:String,idx:=lis.size()) -> void:
		lis.insert(idx,ctn)
		pass
	
	func remove(idx:int) -> void:
		lis.remove(idx)
		pass
	
	func clear() -> void:
		(lis as Array).clear()
		pass
	
	func save():
		file.open(path,File.WRITE)
		file.store_string(content())
		file.close()
		pass
	
	func count():
		return lis.size()
		pass
	
	func to_csv(ctn:String):
		return str2var("[%s]" % ctn)
	
	
	
	# 返回整体内容
	func content() -> String:
		var ctn = ""
		var idx = 0
		for line in lis:
			if idx == lis.size(): # 最后一行
				if line != "": # 不为空
					ctn += line
			else:
				ctn += line + "\n"
		return ctn


# 文件夹	
class mDir:
	var path:String
	var dir = Directory.new()
	
	func _init(dirPath:String):
		path = dirPath
	
	# 返回指定后缀名的文件名列表
	func filter(filter:String) -> Array:
		var files = []
		if dir.open(path) == OK:
			dir.list_dir_begin()
			var file_name = dir.get_next()
			while file_name != "":
				if dir.current_is_dir() == false and "." + file_name.get_extension() == filter:
					files.append(file_name) 
				file_name = dir.get_next()
		return files
		
	
	# 返回第一级子文件夹名称列表
	func sub_dirs() -> Array:
		var dirs = []
		if dir.open(path) == OK:
			dir.list_dir_begin()
			var dir_name = dir.get_next()
			while dir_name != "":
				if dir.current_is_dir() and dir_name != "." and dir_name != "..":
					dirs.append(dir_name) 
				dir_name = dir.get_next()
		return dirs

	func remove() -> void:
		if dir.dir_exists(path):
			dir.remove(path)
